# 导入必要的模块
import logging
import threading
from queue import Queue
from logging.handlers import TimedRotatingFileHandler
import os

# 定义一个日志记录类，继承自logging.Logger
class ConcurrentLogger(logging.Logger):
    def __init__(self, name, level=logging.INFO, file=None):
        # 调用父类的初始化方法
        super().__init__(name, level)
        # 设置日志格式
        fmt = "%(asctime)s - %(filename)s[line:%(lineno)d]  %(process)d- %(levelname)s: %(message)s"
        formatter = logging.Formatter(fmt)
        # 设置日志输出渠道
        if file:
            # 如果指定了文件名，则输出到文件，并使用TimedRotatingFileHandler实现按天分割和保留7天
            handler = TimedRotatingFileHandler(file, when="D", backupCount=7, encoding="utf-8")
        else:
            # 否则输出到控制台
            handler = logging.StreamHandler()
        # 设置处理器的格式化器
        handler.setFormatter(formatter)
        # 给记录器添加处理器
        self.addHandler(handler)
        # 创建一个队列，用于存放日志消息
        self.queue = Queue()
        # 创建一个线程，用于从队列中获取日志消息并记录
        self.thread = threading.Thread(target=self.log_from_queue)
        # 设置线程为守护线程，随主线程退出
        self.thread.setDaemon(True)
        # 启动线程
        self.thread.start()

    def log_from_queue(self):
        # 从队列中循环获取日志消息，并调用父类的方法进行记录
        while True:
            record = self.queue.get()
            super().handle(record)

    def handle(self, record):
        # 重写handle方法，将日志消息放入队列中，而不是直接记录
        self.queue.put(record)

# 创建一个日志记录对象
os.makedirs("./logs", exist_ok=True)
logger = ConcurrentLogger("cnlpr", file="logs/cnlpr.log")

# 测试并发记录日志的效果
# def test():
#     for i in range(10):
#         logger.info(f"这是来自线程{threading.current_thread().name}的日志{i}")

# threads = []
# for i in range(5):
#     t = threading.Thread(target=test, name=f"T{i}")
#     threads.append(t)
#     t.start()

# for t in threads:
#     t.join()

# logger.info("测试结束")
